package com.day20_reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @ClassName: Reflect_test03
 * @Author: zw
 * @Description: 出百万拳，行万里路；
 * @Create 2024/3/31-12:14
 * @Version 1.0
 */
public class Reflect_test03 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<Stduent> stduentClass = Stduent.class;
        // getMethods 获取所有公共的成员方法组成的数据,包括继承的方法
        Method[] methods = stduentClass.getMethods();
        System.out.println("getMethods 获取所有公共的成员方法组成的数据");
        for (Method m: methods) {
            System.out.println(m);
        }
        // getDeclaredMethods 获取所有的成员方法（公有，私有，默认）组成的数组
        Method[] declaredMethods = stduentClass.getDeclaredMethods();
        System.out.println("getDeclaredMethods 获取所有的成员方法（公有，私有，默认）组成的数组");
        for (Method d: declaredMethods) {
            System.out.println(d);
        }
        // getMethod 获取单个的成员方法 参数是 方法名， 和 参数类型
        Method setName = stduentClass.getMethod("setName", String.class);
        // getDeclaredMethod 获取单个成员方法（公有，私有，默认） 参数是 方法名， 和 参数类型
        Method setLevle = stduentClass.getDeclaredMethod("setLevle", String.class);

        // 调用方法
        // 通过Student类对象 获取构造方法
        Constructor<Stduent> constructor = stduentClass.getConstructor();
        // 反射生产对象
        Stduent stduent = constructor.newInstance();
        // 反射的方式调用成员方法
        setName.invoke(stduent, "红河");
        System.out.println(stduent);

    }
}
